#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main()
{
    // 1.创建密钥
    key_t key = ftok("/home", 123);

    // 2.创建消息队列
    int msgid = msgget(key, IPC_CREAT | 0777);
    if (msgid == -1)
    {
        perror("msgget error");
        return -1;
    }

    // 接收消息包
    struct msgbuf
    {
        long mtype;       /* 消息类型, must be > 0 */
        char mtext[1024]; /* 消息数据,大小任意用户定义*/
    };

    pid_t pid = fork(); // 创建进程

    if (pid == 0) // 子进程接收消息包
    {
        int type = getpid(); // 获取当前进程pid作为消息的类型
        printf("当前进程接收消息类型:%d\n", type);
        while (1)
        {
            struct msgbuf buf = {0};
            msgrcv(msgid, &buf, 1024, type, 0); // 接收消息包
            printf("接收到的消息是:%s\n", buf.mtext);
        }
    }

    if (pid > 0) // 父进程发送消息包
    {
        while (1)
        {
            struct msgbuf msg = {0}; // 清空消息包
                                     //  msg.mtype = 类型;
                                     //  strcpy(msg.mtext, "hello world");
            printf("请输入要发送的消息类型\n");
            scanf("%ld", &msg.mtype);
            printf("请输入要发送的消息内容\n");
            scanf("%s", msg.mtext);

            msgsnd(msgid, &msg, strlen(msg.mtext), 0);
        }
    }
    return 0;
}